﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NUnit.Framework;
using Helpers;
using Capa_Dominio;
using Capa_Persistencia_NH;
using Capa_Persistencia_NH.Interface;
using Capa_Persistencia_NH.AccesoDatos;

namespace Capa_TestingProyects
{
    [TestFixture]
    public class Test_AdministrarAlquiler
    {
        private IAdministrarAlquiler adminAdministrarAlquiler = null;
        int codigoGenerado = 0;
        TipoDocumento objTipoDocumento;
        Distrito objDistrito;
        Cliente objCliente;
        Local objLocal;
        SalaEnsayo objSalaEnsayo;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            TipoDocumentoDAO adminTipoDocumento;
            DistritoDAO adminDistrito;
            ClienteDAO adminCliente;
            LocalDAO adminLocal;
            SalaEnsayoDAO adminSalaEnsayo;

            adminAdministrarAlquiler =  new AdministrarAlquilerDAO();
            adminTipoDocumento = new TipoDocumentoDAO();
            adminDistrito = new DistritoDAO();
            adminCliente = new ClienteDAO();
            adminLocal = new LocalDAO();
            adminSalaEnsayo = new SalaEnsayoDAO();

            foreach (AdministrarAlquiler AdministrarAlquiler in adminAdministrarAlquiler.ListarTodos())
                adminAdministrarAlquiler.Eliminar(AdministrarAlquiler);
            // 4. Creamos 2 AdministrarAlquileres para tenerlos disponibles en las pruebas

            objTipoDocumento = adminTipoDocumento.Obtener(1);
            objDistrito = adminDistrito.Obtener(1);

            objCliente = adminCliente.Crear(new Cliente() { Apellidos = "Rojas Quispe", Nombres = "Angela", TipoDocumento = objTipoDocumento, NumeroDocumento = "40567980", Email = "rojasquispe@hotmail.com", ClaveAcceso = "nada", Direccion = "Casa", FechaNacimiento = new DateTime(1980, 5, 23, 0, 0, 0), Distrito = objDistrito, Estado = true });

            objLocal = adminLocal.Crear(new Local() { NombreLocal = "Monterrico", Distrito = objDistrito, Direccion = "Av. Primavera 123", Estado = true });

            objSalaEnsayo = adminSalaEnsayo.Crear(new SalaEnsayo() { NombreSala = "Sala 1", Local = objLocal, Capacidad = 6, Caracteristicas = "Sala para 6", Disponibilidad = true, Comentarios = "", Estado = true });
        }

        [Test]
        public void Test1_Crear()
        {
            Assert.IsNotNull(adminAdministrarAlquiler);
            //se instancia a la entidad a crear
            AdministrarAlquiler objAdministrarAlquiler = new AdministrarAlquiler();
            objAdministrarAlquiler.SalaEnsayo = objSalaEnsayo;
            objAdministrarAlquiler.Cliente = objCliente;
            objAdministrarAlquiler.FechaAlquiler = new DateTime(2011, 9, 22, 8, 00, 00);
            objAdministrarAlquiler.TotalHoras = 8;
            objAdministrarAlquiler.TotalAlquiler = 8;
            objAdministrarAlquiler.Estado = true;
            //se declara la entidad que se retornara
            AdministrarAlquiler AdministrarAlquilerRetornado = null;
            //no aseguramos que no retorne una exepcion
            //Assert.DoesNotThrow(delegate
            //{
                AdministrarAlquilerRetornado = adminAdministrarAlquiler.Crear(objAdministrarAlquiler);
                codigoGenerado = AdministrarAlquilerRetornado.CodigoAlquiler;
            //},"AdministrarAlquiler Generado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(AdministrarAlquilerRetornado);
            //verificamos que el codigo generado sera mayor que 0
            Assert.Greater(codigoGenerado, 0);
        }
        [Test]
        public void Test2_Modificar()
        {
            // 1. Clase a probar: AdministrarAlquilerDAO
            Assert.IsNotNull(adminAdministrarAlquiler);
            // 2. Declaramos e instanciamos la entidad de dominio
            AdministrarAlquiler AdministrarAlquilerAModificar = adminAdministrarAlquiler.Obtener(codigoGenerado);
            AdministrarAlquilerAModificar.SalaEnsayo = objSalaEnsayo;
            AdministrarAlquilerAModificar.Cliente = objCliente;
            AdministrarAlquilerAModificar.FechaAlquiler = new DateTime(2011, 9, 22, 8, 00, 00);
            AdministrarAlquilerAModificar.TotalHoras = 8;
            AdministrarAlquilerAModificar.TotalAlquiler = 8;
            AdministrarAlquilerAModificar.Estado = true;
            // 3. Declaramos la entidad que contendrá el resultado
            AdministrarAlquiler AdministrarAlquilerModificado = null;
            // 4. Probamos que no ocurra error al ejecutar el método
            //Assert.DoesNotThrow(delegate
            //{
                // 5. Ejecutamos el método a probar
                AdministrarAlquilerModificado = adminAdministrarAlquiler.Modificar(AdministrarAlquilerAModificar);
            //}, "AdministrarAlquiler modificado");
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(AdministrarAlquilerModificado);
            // Probamos que el código generado sea mayor a 0
            Assert.AreEqual(AdministrarAlquilerModificado.SalaEnsayo, objSalaEnsayo);
            // Probamos que el nombre registrado es igual al solicitado con la entidad
            Assert.AreEqual(AdministrarAlquilerModificado.Cliente, AdministrarAlquilerAModificar.Cliente);
            // Probamos que la dirección registrada es igual a la solicitada con la entidad
            Assert.AreEqual(AdministrarAlquilerModificado.FechaAlquiler, AdministrarAlquilerAModificar.FechaAlquiler);
            Assert.AreEqual(AdministrarAlquilerModificado.TotalHoras, AdministrarAlquilerAModificar.TotalHoras);
            Assert.AreEqual(AdministrarAlquilerModificado.TotalAlquiler, AdministrarAlquilerAModificar.TotalAlquiler);
            Assert.AreEqual(AdministrarAlquilerModificado.Estado, AdministrarAlquilerAModificar.Estado);
        }

        [Test]
        public void Test3_Eliminar()
        {
            // 1. Clase a probar: AdministrarAlquilerDAO
            Assert.IsNotNull(adminAdministrarAlquiler);
            // 2. Definimos la entidad que contendrá el resultado
            AdministrarAlquiler AdministrarAlquilerExistente = adminAdministrarAlquiler.Obtener(codigoGenerado);
            // 3. Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                // 5. Ejecutamos el método a probar
                adminAdministrarAlquiler.Eliminar(AdministrarAlquilerExistente);
            });
            // Probamos que la entidad ya no existe
            Assert.IsNull(adminAdministrarAlquiler.Obtener(codigoGenerado));
        }

        [Test]
        public void Test4_ListarTodos()
        {
            // 1. Clase a probar: LocalDAO
            Assert.IsNotNull(adminAdministrarAlquiler);
            // Declaramos la entidad que contendrá el resultado
            ICollection<AdministrarAlquiler> administrarAlquilerEncontrados = null;
            //  Probamos que no ocurra error al ejecutar el método
            Assert.DoesNotThrow(delegate
            {
                //  Ejecutamos el método a probar
                administrarAlquilerEncontrados = adminAdministrarAlquiler.ListarTodos();
            });
            // Probamos que la entidad resultante no sea nula
            Assert.IsNotNull(administrarAlquilerEncontrados);
        }

        [TestFixtureTearDown]
        public void TerminarPruebas()
        {
            NHibernateHelper.CerrarFabrica();
        }
    }
}
